<!--
 * @Author: wanggang
 * @Date: 2019-06-25 13:22:56
 * @Description: 
 -->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div>发布-订阅模式</div>
</body>

</html>


<script>
    // 发布-订阅模式
    // https://www.jianshu.com/p/0aacfec05046
    // call和apply的用法
    let log = console.log;
    let event = {
        clientList: {},
        listen(key, fn) {
            if (!this.clientList[key]) {
                this.clientList[key] = [];
            }
            this.clientList[key].push(fn);
        },

        trigger(key, money) {
            let fns = this.clientList[key];
            if (!fns || fns.length === 0) {//没有绑定对应的消息
                return false;
            }
            fns.forEach(fn => {
                // this指向price=>对象
                // fn.apply(obj,arguments) obj改变fn中的this的指向,让obj代替fn中的this对象
                fn.apply(this, [money])
            });

        }
    }

    // 再定义一个installEvent函数，用于给所有对象动态安装发布-订阅功能
    // 如：另一家售楼处也想要这个功能，就可以调用这个注册了，不同再写多一次这段代码
    let installEvent = (obj) => {
        for (let i in event) {
            obj[i] = event[i]
        }
    }

    // 给售楼处对象salesOffices动态增加发布-订阅功能
    let salesOffices = {}
    installEvent(salesOffices)
    // 小明订阅信息
    salesOffices.listen('squareMeter88', price => {
        console.log('小明，你看中的88平方的房子，价格=' + price)
    })
    // 小光订阅信息
    salesOffices.listen('squareMeter88', price => {
        console.log('小光，你看中的88平方的房子，价格=' + price)
    })
    // 小红订阅信息
    salesOffices.listen('squareMeter100', price => {
        console.log('小红，你看中的100平方的房子，价格=' + price)
    })
    salesOffices.trigger('squareMeter88', 20000)
    salesOffices.trigger('squareMeter100', 25000)

    // function animal(name, age) {

    //     this.name = name;
    //     this.age = age;
    // }
    // function person(name, age) {
    //     console.log(arguments);
    //     animal.apply(this, arguments);
    // }
    // var me = new person("kaifa", 18);
    // console.log(me); //person {name: "kaifa", age: 18}
</script>